[アップデート] Amazon TimestreamからS3へのエクスポートがサポートされました
大阪オフィスの小倉です。
Amazon TimestreamからAmazon S3へのエクスポートがサポートされました。
概要
S3へのエクスポートには、UNLOAD
ステートメントを使用します。TO
で出力先のS3バケットを指定します。
S3バケットは、Timestreamと同一のAWSアカウント、リージョンである必要があります。
UNLOAD (SELECT statement) TO 's3://bucket-name/folder' WITH ( option = expression [, ...] )
WITH
で以下のオプションを指定できるようです。
{ partitioned_by = ARRAY[ col_name[,…] ] # デフォルト:なし | format = [ '{ CSV | PARQUET }' ] # デフォルト:CSV | compression = [ '{ GZIP | NONE }' ] # デフォルト:GZIP | encryption = [ '{ SSE_KMS | SSE_S3 }' ] # デフォルト:SSE_S3 | kms_key = '<string>' | field_delimiter ='<character>' # デフォルト:(,) | escaped_by = '<character>' # デフォルト:(\) | }
詳細については以下を確認してください。
動作確認
コンソールからエクスポートの動作を確認してみます。
エクスポート元のデータは、Timestreamのコンソールから作成できるサンプルデータベースを利用しました。
今回はマルチメジャーレコードのIoTデータを使用します。
まずは単純なクエリでのエクスポートを試してみます。
S3バケットとquery01
フォルダを事前に作成しておきます。
UNLOAD( SELECT * FROM "cm-ogura-sample-db"."IoTMulti" WHERE time between ago(1h) and now() ORDER BY time DESC LIMIT 100 ) TO 's3://cm-ogura-timestream-unload/query01'
S3を確認してみると、query01
フォルダ配下に以下が作成されました。
results
配下にはgzip圧縮されたデータが出力されていました。
出力されたデータを見ると、CSV形式で出力されています。
Alpha,21135517,100,359,1000,Peterbilt,IoTMulti-stats,2023-05-16 20:32:18.560000000,20.0,22.15921527271879,"34.7465° N, 92.2896° W",64.0 Alpha,433496933,100,Wrecker,500,Peterbilt,IoTMulti-stats,2023-05-16 20:31:08.469000000,115.0,66.48206913078647,"36.1627° N, 86.7816° W",50.0 Alpha,683993576,100,359,1000,Peterbilt,IoTMulti-stats,2023-05-16 20:30:37.970000000,278.0,60.23148110604007,"33.7490° N, 84.3880° W",18.0 Alpha,1575739296,100,359,1000,Peterbilt,IoTMulti-stats,2023-05-16 20:30:14.766000000,449.0,60.57110447043918,"46.5891° N, 112.0391° W",56.0 Alpha,1234546252,150,W925,1000,Kenworth,IoTMulti-stats,2023-05-16 20:28:05.519000000,77.0,89.48180813940486,"44.9537° N, 93.0900° W",47.0 Alpha,2759574409,100,359,1000,Peterbilt,IoTMulti-stats,2023-05-16 20:26:47.095000000,551.0,87.05368095062727,"38.5816° N, 121.4944° W",14.0 Alpha,5670048029,150,C-600,1000,Ford,IoTMulti-stats,2023-05-16 20:26:33.287000000,370.0,0.4367898574554866,"34.7465° N, 92.2896° W",70.0 (以下略)
次に、partitioned_by
を使って、パーティションを作成しつつエクスポートしてみます。
UNLOAD( SELECT fleet, truck_id, fuel_capacity, load_capacity, measure_name, time, load, "fuel-reading", location, speed, make, model FROM "cm-ogura-sample-db"."IoTMulti" WHERE time between ago(1h) and now() ORDER BY time DESC LIMIT 100 ) TO 's3://cm-ogura-timestream-unload/query02' WITH ( partitioned_by=ARRAY['make','model'])
partitioned_by
には複数の列を指定できます。
このときpartitioned_by
に指定した列は、partitioned_by
で指定した順序で、SELECT句の末尾に指定する必要があるので注意してください。
今回はSELECT *
だと上記条件を満たせないので、SELECT句に列名を直接指定しました。
S3のresults
配下を確認すると、make=XXXX
の階層が作成されています。
make=Peterbilt
の配下には、model=XXXX
の階層が作成されていることが確認できます。
出力されたCSVファイルは、partitioned_by
に指定した列の値を除いたデータとなっています
Alpha,433496933,100,500,IoTMulti-stats,2023-05-16 20:31:08.469000000,115.0,66.48206913078647,"36.1627° N, 86.7816° W",50.0 Alpha,433496933,100,500,IoTMulti-stats,2023-05-16 20:24:40.560000000,392.0,82.98060906828232,"36.1627° N, 86.7816° W",6.0 Alpha,1836816173,100,500,IoTMulti-stats,2023-05-16 20:20:57.832000000,381.0,31.006693572246814,"33.7490° N, 84.3880° W",30.0 Alpha,7219245711,100,500,IoTMulti-stats,2023-05-16 20:19:59.456000000,349.0,19.78241022554396,"40.2338° N, 111.6585° W",48.0 (以下略)
まとめ
TimestreamからS3へのエクスポートを試してみました。
S3にエクスポートが可能になったことで、Timestreamに蓄積した時系列データを他のサービスで活用できるシーンが大幅に増えそうだと思いました。
また、私は見落としていたのですが、Timesteramは2023年3月にS3からのバッチロードに対応しているようなので、そちらとの組み合わせも今後検証しようと思います。